#include "ListPage.h"
#include "oled.h"
#include <stdio.h>
#include "shdl.h"

namespace MircoUi {

    void ListPage::addItem(ListItem* new_item){
        Linklist_append((void**)&linked_list_head, SHDL_OFFSETOF(ListItem,next), new_item);
        status = 0; // 标记页面需要刷新
    }


    void ListPage::onEvent(uint32 event_id, uint32 event_par){
        if(eventCB) {
            eventCB(event_id, event_par);
        }
        if(event_id == eEvent::TICK){
        } else if(event_id == eEvent::ENTER_PAGE) {
            
        } else if(event_id == eEvent::EXIT_PAGE) {
            status = 0; // 清除状态，准备退出页面
        }
    }

    static int foreachPrint(tPtr node, void* tag) {
        sVec2* point = (sVec2*)tag;
        OLED_ShowString(point->x, point->y, ((ListItem*)node)->text,8,1);
        point->y += 10; 
        if(point->y >= 54) { 
            if(point->x < 64) {
                point->x = 64; // 换行
                point->y = 14; // 重置y坐标到第二行
            } else {
                return 1;
            }
        }
        return 0; // 继续遍历
    }

    void ListPage::refresh(){
        if(status == 0){
            OLED_Clear(); // 清空OLED屏幕
            OLED_ShowString(0, 0, title, 12, 1); // 显示标题
            sVec2 point(0, 14); // 从第二行开始绘制内容
            Linklist_foreach((tPtr*)&linked_list_head,SHDL_OFFSETOF(ListItem,next), foreachPrint, &point);
            OLED_Refresh(); // 刷新OLED屏幕
            status = 1; // 标记页面已绘制            
        }
    }
}

